#pragma once
#include "collect.h"

template <class T> 
class gc_ptr
{
public:

	T* ptr;

	T& operator*() const
	{
		return *ptr; 
	}

	T* operator->() const
	{
		return ptr; 
	}

	T* get() const
	{
		return ptr; 
	}

	T& operator[](size_t index) const
	{
		return ptr[index]; 
	}


	gc_ptr& operator = (const gc_ptr <T> &a) 
	{
		ptr = a.ptr;

		return *this;
	}

	bool operator == (const gc_ptr <T> &a) 
	{
		return (a.ptr == ptr);
	}

	bool operator != (const gc_ptr <T> &a)
	{
		return (a.ptr != ptr);
	}


	gc_ptr& operator = (T *a)
	{
		ptr = a;
		return *this;
	}


	gc_ptr()
	{
		inc((void *)this);
		ptr = 0;
	}

	gc_ptr(T* p)
	{
		inc((void *)this);
		ptr = p;
	}

	gc_ptr(const gc_ptr <T> &p)
	{
		inc((void *)this);
		ptr = p.ptr;
	}



	~gc_ptr()
	{
		dec(this);
	}
};

